﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using ENT.PM.Core;
using ENT.PM.Core.Lookup;
using Coolite.Ext.Web;
using System.Configuration;
using ENT.PM.Core.Proyecto;
using ENT.PM.Core.Core;
using ENT.PM.Core.Proyecto.Binacional;
using ENT.PM.Core.Listas;
using ent_pm.Code;

public partial class Proyectos_Binacional_wucProyecto : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            if (!IsPostBack)
            {
                TipoLookup.InvalidateCache();
                EjesLookup.InvalidateCache();
                ProgramaLookup.InvalidateCache();
                EstadoProyectoLookup.InvalidateCache();
                IndicadoresLookup.InvalidateCache();
                EntidadLookup.InvalidateCache();
                RegionLookup.InvalidateCache();
                SectorLookup.InvalidateCache();

                stoMoneda.DataSource = MonedaLookup.GetNameValueList();
                stoMoneda.DataBind();
                sPais.DataSource = PaisLista.GetPaisLista();
                sPais.DataBind();
                sRegion.DataSource = RegionLista.GetRegionLista();
                sRegion.DataBind();
                sProvincia.DataSource = ProvinciaLista.GetProvinciaLista();
                sProvincia.DataBind();
                sCanton.DataSource = CantonLista.GetCantonLista();
                sCanton.DataBind();
                sDistrito.DataSource = DistritoLista.GetDistritoLista();
                sDistrito.DataBind();
                sSectores.DataSource = SectorLookup.GetNameValueList();
                sSectores.DataBind();
                sTipo.DataSource = TipoLookup.GetNameValueList();
                sTipo.DataBind();
                sEstadoProyecto.DataSource = EstadoProyectoLookup.GetNameValueList();
                sEstadoProyecto.DataBind();
                sEjes.DataSource = EjesLookup.GetNameValueList();
                sEjes.DataBind();
                sPrograma.DataSource = ProgramaLookup.GetNameValueList();
                sPrograma.DataBind();
                sEntidad.DataSource = EntidadLookup.GetNameValueList();
                sEntidad.DataBind();
            }
        }
        catch (Exception ex)
        {
            System.Text.Encoding encod = System.Text.Encoding.UTF8;
            System.IO.FileStream log = System.IO.File.Open(ConfigurationManager.AppSettings.Get("PathLog"), System.IO.FileMode.Append);
            log.Write(encod.GetBytes(ex.Message + Environment.NewLine), 0, encod.GetByteCount(ex.Message + Environment.NewLine));
            log.Close();
        }
    }

    public void Show(int Id)
    {
        CargarDatos(Id);
        btnEliminar.Hide();
        winProyectos.Show();
        btnGuardarTodo.Show();
        btnSiguiente.Show();
        btnGuardarDG.Show();
        btnAtrasE.Show();
        btnSiguienteE.Show();
        btnGuardarE.Show();
        btnSiguienteA.Show();
        btnAtrasA.Show();
        btnGuardarA.Show();
        btnSiguienteI.Show();
        btnAtrasI.Show();
        btnGuardarI.Show();
        btnSiguienteL.Show();
        btnAtrasL.Show();
        btnGuardarL.Show();
        btnAtrasC.Show();
        btnSiguienteC.Show();
        btnGuardarC.Show();
        btnAtrasCC.Show();
        btnSiguienteCC.Show();
        btnGuardarCC.Show();
        btnAtrasO.Show();
        btnSiguienteO.Show();
        btnGuardarO.Show();
        btnAtrasD.Show();
        btnGuardarD.Show();

    }

    public void Show(int Id, string operacion)
    {
        CargarDatos(Id);
        btnEliminar.Show();
        btnGuardarTodo.Hide();
        btnSiguiente.Hide();
        btnGuardarDG.Hide();
        btnAtrasE.Hide();
        btnSiguienteE.Hide();
        btnGuardarE.Hide();
        btnSiguienteA.Hide();
        btnAtrasA.Hide();
        btnGuardarA.Hide();
        btnSiguienteI.Hide();
        btnAtrasI.Hide();
        btnGuardarI.Hide();
        btnSiguienteL.Hide();
        btnAtrasL.Hide();
        btnGuardarL.Hide();
        btnAtrasC.Hide();
        btnSiguienteC.Hide();
        btnGuardarC.Hide();
        btnAtrasCC.Hide();
        btnSiguienteCC.Hide();
        btnGuardarCC.Hide();
        btnAtrasO.Hide();
        btnSiguienteO.Hide();
        btnGuardarO.Hide();
        btnAtrasD.Hide();
        btnGuardarD.Hide();
        winProyectos.Show();
    }

    public void Show()
    {
        hidIdPerfilProyecto.SetValue(0);
        winProyectos.Show();
    }

    #region Carga de datos Basicos del proyecto y Guardar los mismos
    /// <summary>
    /// Cargar los datos del proyecto
    /// </summary>
    /// <param name="Id"></param>
    void CargarDatos(int Id)
    {
        Proyecto objProyecto = Proyecto.GetProyecto(Id);
        hidIdPerfilProyecto.Text = Id.ToString();
        dFechaDesde.SetValue(objProyecto.FechaInicio);
        if (objProyecto.FechaFin.Value.Year == 1)
        {
            dFechaHasta.SetValue(new DateTime(2500, 1, 1));
            dFechaHasta.Reset();
        }
        else
            dFechaHasta.SetValue(objProyecto.FechaFin);

        hidAI.Text = objProyecto.FechaInicio.Value.Year.ToString();
        hidAF.Text = objProyecto.FechaFin.Value.Year.ToString();
        hidMI.Text = objProyecto.FechaInicio.Value.Month.ToString();
        hidMF.Text = objProyecto.FechaFin.Value.Month.ToString();
        hidDI.Text = objProyecto.FechaInicio.Value.Day.ToString();
        hidDF.Text = objProyecto.FechaFin.Value.Day.ToString();

        txtDuracionProy.SetValue(objProyecto.DuracionProy);
        txtNombreProyecto.SetValue(objProyecto.Nombre);
        txaDescripcion.SetValue(objProyecto.DescripcionAdicional);
        //cbxTipo.SetValue(objProyecto.Tipo);
        cbxEjes.SetValue(objProyecto.Eje);
        cbxPrograma.SetValue(objProyecto.Programa);
        cbxEstadoProy.SetValueAndFireSelect(objProyecto.Estado);
        nfPorcentajeA.Text = objProyecto.PorcentajeAvance.ToString();
        txtObEstado.Text = objProyecto.Observacion;
        txtObjGeneral.Text = objProyecto.ObjetivoGeneral;
        txtObjEspecifico.Text = objProyecto.ObjetivoEspecifico;
        int valorAvance;
        int.TryParse(objProyecto.PorcentajeAvance.ToString(), out valorAvance);
        sliPorcentaje.Value = valorAvance;
        //Localizacion

        txtLatitud.SetValue(objProyecto.Latitud);
        txtLongitud.SetValue(objProyecto.Longitud);
        nfPorcentajeA.Text = objProyecto.PorcentajeAvance.ToString();
        //sPais.DataSource = PaisLookup.GetNameValueList();
        //sPais.DataBind();
        //sRegion.DataSource = RegionLookup.GetNameValueList(ConfigurationManager.AppSettings.Get("CodigoRegionSenplades").ToString());
        //sRegion.DataBind();
        //CargarRegion(objProyecto.Region);        
        //CargarProvincias(objProyecto.Region);
        //CargarCantones(objProyecto.Provincia);
        //cbxRegion.SetValue(objProyecto.Region);
        //cbxProvincia.SetValue(objProyecto.Provincia);
        //cbxCanton.SetValue(objProyecto.Canton);
        //txtParroquia.Text = (objProyecto.Parroquia);
        nfNHabitantes.Number = objProyecto.NumeroHabitantes;

        //Informacion Financiera
        stoInversionistas.DataSource = objProyecto.Inversiones;
        stoInversionistas.DataBind();

        nfInversionTotal.Number = objProyecto.CostoTotal;

        switch (objProyecto.PoblacionAfectada)
        {
            case 605:
                rUrbano.SetValue(true);
                rUrbanoMarginal.SetValue(false);
                rRural.SetValue(false);
                break;
            case 606:
                rUrbanoMarginal.SetValue(true);
                rRural.SetValue(false);
                rUrbano.SetValue(false);
                break;
            case 607:
                rRural.SetValue(true);
                rUrbano.SetValue(false);
                rUrbanoMarginal.SetValue(false);
                break;

        }

        sAvances.DataSource = objProyecto.Avances;
        sAvances.DataBind();
        sProyectoEstados.DataSource = objProyecto.Estados;
        sProyectoEstados.DataBind();

        stoLocalizacion.DataSource = objProyecto.Localizaciones;
        stoLocalizacion.DataBind();

        stoLocalizacionesGeo.DataSource = objProyecto.Ubicaciones;
        stoLocalizacionesGeo.DataBind();

        sCoordinacion.DataSource = objProyecto.Coordinadores;
        sCoordinacion.DataBind();
        StoreDocumentos.DataSource = objProyecto.DocumentosPerfil;
        StoreDocumentos.DataBind();
        StoreDocumentosDP.DataSource = objProyecto.DocumentosPerfilDictamen;
        StoreDocumentosDP.DataBind();
        StoreDocumentosVT.DataSource = objProyecto.DocumentosConvenio;
        StoreDocumentosVT.DataBind();
        StoreSector.DataSource = objProyecto.Sectores;
        StoreSector.DataBind();
        winProyectos.AddScript("MarcarSectores();");

        stoComponente.DataSource = objProyecto.Componentes;
        stoComponente.DataBind();

        stoInversionistasComponente.DataSource = objProyecto.ComponenteInversiones;
        stoInversionistasComponente.DataBind();
    }

    /// <summary>
    /// Permite guardar la informacion parcial del tab que se encuentra activo 
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    public void btnGuardarTab_Click(object sender, AjaxEventArgs e)
    {
        string jsonCoordinador = "", jsonSectores = "", jsonInversiones = "", jsonInversionesComponente = "", jsonComponentes = "";
        string jsonLocalizaciones = "", jsonDocumentos = "", jsonEstados = "", jsonAvances = "", jsonUbicaciones = "";
        int tabNumero;
        int.TryParse(e.ExtraParams["TabNumero"], out tabNumero);

        switch (tabNumero)
        {
            case 1: jsonSectores = e.ExtraParams["Sectores"];
                break;
            case 2: jsonEstados = e.ExtraParams["Estados"];
                break;
            case 3: jsonAvances = e.ExtraParams["Avances"];
                break;
            case 4: jsonInversiones = e.ExtraParams["Inversionistas"];
                break;
            case 5: jsonUbicaciones = e.ExtraParams["Ubicaciones"];
                jsonLocalizaciones = e.ExtraParams["Localizaciones"];
                break;
            case 6: jsonCoordinador = e.ExtraParams["Coordinadores"];
                break;
            case 7: jsonInversionesComponente = e.ExtraParams["InversionesComponentes"];
                jsonComponentes = e.ExtraParams["Componentes"];
                break;

            case 9: jsonDocumentos = e.ExtraParams["Documentos"];
                break;
        }
        GuardarDatos(jsonCoordinador, jsonSectores, jsonInversiones, jsonInversionesComponente, jsonComponentes, jsonUbicaciones, jsonLocalizaciones, jsonDocumentos, jsonEstados, jsonAvances, 1, tabNumero);

    }

    /// <summary>
    /// Eliminar los datos del proyecto
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    public void btnEliminar_Click(object sender, AjaxEventArgs e)
    {
        try
        {
            int IdProy;
            int.TryParse(hidIdPerfilProyecto.Text,out IdProy);
            var proyecto = Proyecto.GetProyecto(IdProy);
            proyecto.Delete();
            proyecto = proyecto.Save();
            Ext.Msg.Show(new MessageBox.Config
            {
                Title = "Eliminación de proyecto",
                Message = "El proyecto se elimino correctamente",
                Buttons = MessageBox.Button.OK,
                Icon = MessageBox.Icon.INFO
            });
            LimpiarFormulario();

        }
        catch (Exception ex)
        {
            Ext.Msg.Show(new MessageBox.Config
            {
                Title = "Error",
                Message = "Error al eliminar proyecto",
                Buttons = MessageBox.Button.OK,
                Icon = MessageBox.Icon.ERROR
            });
            Util.RegistarLog(ex.ToString());
        }
    }

    /// <summary>
    /// Guardar los datos del proyecto
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    public void btnGuardar_Click(object sender, AjaxEventArgs e)
    {
        string jsonCoordinador = e.ExtraParams["Coordinadores"];
        string jsonSectores = e.ExtraParams["Sectores"];
        string jsonInversiones = e.ExtraParams["Inversionistas"];
        string jsonInversionesComponente = e.ExtraParams["InversionesComponentes"];
        string jsonComponentes = e.ExtraParams["Componentes"];
        string jsonUbicaciones = e.ExtraParams["Ubicaciones"];
        string jsonLocalizaciones = e.ExtraParams["Localizaciones"];
        string jsonDocumentos = e.ExtraParams["Documentos"];
        string jsonEstados = e.ExtraParams["Estados"];
        string jsonAvances = e.ExtraParams["Avances"];
        GuardarDatos(jsonCoordinador, jsonSectores, jsonInversiones, jsonInversionesComponente, jsonComponentes, jsonUbicaciones, jsonLocalizaciones, jsonDocumentos, jsonEstados, jsonAvances, 0, 0);
    }
    /// <summary>
    /// Recoge todos los campos para guardarlos en la base de datos
    /// </summary>
    /// <param name="jsonCoordinadores"></param>
    private void GuardarDatos(string jsonCoordinadores, string jsonSectores, string jsonInversiones, string jsonInversionesComponente, string jsonComponentes, string jsonUbicaciones, string jsonLocalizaciones, string jsonDocumentos, string jsonEstados, string jsonAvances, int opc, int tabNumero)
    {
        try
        {
            Proyecto proyecto;
            int IdProy, duracion, idEstado, idEje, idPrograma;
            int.TryParse(hidIdPerfilProyecto.Text, out IdProy);

            if (IdProy > 0)
                proyecto = Proyecto.GetProyecto(IdProy);
            else
                proyecto = Proyecto.NewProyecto();

            #region Datos Generales
            if (opc == 0 || tabNumero == 1)
            {
                proyecto.Dictamen = "SI";
                proyecto.Viabilidad = "SI";
                proyecto.Tipo = 271;
                proyecto.Nombre = txtNombreProyecto.Text;
                proyecto.DescripcionAdicional = txaDescripcion.Text;

                proyecto.FechaInicio = new DateTime(Convert.ToInt32(hidAI.Text), Convert.ToInt32(hidMI.Text), Convert.ToInt32(hidDI.Text));
                proyecto.FechaFin = new DateTime(Convert.ToInt32(hidAF.Text), Convert.ToInt32(hidMF.Text), Convert.ToInt32(hidDF.Text));

                int.TryParse(txtDuracionProy.Text, out duracion);
                proyecto.DuracionProy = duracion;

                //Sector Estartegico
                StoreDataHandler sdhSectores = new StoreDataHandler(jsonSectores);
                ChangeRecords<ProyectoSector> crSectores = sdhSectores.ObjectData<ProyectoSector>();
                foreach (var sector in crSectores.Deleted)
                {
                    int indice = proyecto.Sectores.IndexOf(proyecto.Sectores.FirstOrDefault(x => x.Id == sector.Id));
                    proyecto.Sectores.RemoveAt(indice);
                }
                foreach (var sector in crSectores.Created)
                {
                    proyecto.Sectores.Add(sector);
                }

                int.TryParse(cbxEjes.SelectedItem.Value, out idEje); int.TryParse(cbxPrograma.SelectedItem.Value, out idPrograma);
                proyecto.Eje = idEje;
                proyecto.Programa = idPrograma;

            }
            #endregion

            #region Datos de Estado
            if (opc == 0 || tabNumero == 2)
            {
                int.TryParse(cbxEstadoProy.SelectedItem.Value, out idEstado);
                //proyecto.Tipo = Convert.ToInt32(cbxTipo.SelectedItem.Value);
                proyecto.Estado = idEstado;
                proyecto.Observacion = txtObEstado.Text;

                //Estados
                StoreDataHandler sdhEstados = new StoreDataHandler(jsonEstados);
                ChangeRecords<ProyectoEstado> crsdhEstados = sdhEstados.ObjectData<ProyectoEstado>();

                foreach (var estado in crsdhEstados.Deleted)
                {
                    int indice = proyecto.Estados.IndexOf(proyecto.Estados.FirstOrDefault(x => x.Id == estado.Id));
                    proyecto.Estados.RemoveAt(indice);
                }

                foreach (var estado in crsdhEstados.Updated)
                {
                    int indice = proyecto.Estados.IndexOf(proyecto.Estados.FirstOrDefault(x => x.Id == estado.Id));
                    Csla.Data.DataMapper.Map(estado, proyecto.Estados[indice]);
                }

                foreach (var estado in crsdhEstados.Created)
                {
                    proyecto.Estados.Add(estado);
                }
            }
            #endregion

            #region Datos de Avance
            if (opc == 0 || tabNumero == 3)
            {
                proyecto.PorcentajeAvance = nfPorcentajeA.Number;
                //Avances
                StoreDataHandler sdhAvances = new StoreDataHandler(jsonAvances);
                ChangeRecords<ProyectoAvance> crsdhAvances = sdhAvances.ObjectData<ProyectoAvance>();

                foreach (var avance in crsdhAvances.Deleted)
                {
                    int indice = proyecto.Avances.IndexOf(proyecto.Avances.FirstOrDefault(x => x.Id == avance.Id));
                    proyecto.Avances.RemoveAt(indice);
                }

                foreach (var avance in crsdhAvances.Updated)
                {
                    int indice = proyecto.Avances.IndexOf(proyecto.Avances.FirstOrDefault(x => x.Id == avance.Id));
                    Csla.Data.DataMapper.Map(avance, proyecto.Avances[indice]);
                }

                foreach (var avance in crsdhAvances.Created)
                {
                    proyecto.Avances.Add(avance);
                }
            }
            #endregion

            #region Datos de información financiera
            if (opc == 0 || tabNumero == 4)
            {
                //Descripcion Aporte
                proyecto.CostoTotal = nfInversionTotal.Number;

                //Informacion Financiera del proyecto
                StoreDataHandler sdhInversiones = new StoreDataHandler(jsonInversiones);
                ChangeRecords<ProyectoInversion> crsdhInversiones = sdhInversiones.ObjectData<ProyectoInversion>();

                foreach (var inversion in crsdhInversiones.Deleted)
                {
                    int indice = proyecto.Inversiones.IndexOf(proyecto.Inversiones.FirstOrDefault(x => x.Id == inversion.Id));
                    proyecto.Inversiones.RemoveAt(indice);
                }

                foreach (var inversion in crsdhInversiones.Updated)
                {
                    int indice = proyecto.Inversiones.IndexOf(proyecto.Inversiones.FirstOrDefault(x => x.Id == inversion.Id));
                    Csla.Data.DataMapper.Map(inversion, proyecto.Inversiones[indice]);
                }

                foreach (var inversion in crsdhInversiones.Created)
                {
                    proyecto.Inversiones.Add(inversion);
                }
            }
            #endregion

            #region Datos de información de Localización
            if (opc == 0 || tabNumero == 5)
            {
                //Area Poblacion Afectada
                if (rUrbano.Checked)
                    proyecto.PoblacionAfectada = 605;
                if (rUrbanoMarginal.Checked)
                    proyecto.PoblacionAfectada = 606;
                if (rRural.Checked)
                    proyecto.PoblacionAfectada = 607;

                proyecto.NumeroHabitantes = nfNHabitantes.Number;

                //Proyecto Ubicaciones Geograficas
                StoreDataHandler sdhUbicaciones = new StoreDataHandler(jsonUbicaciones);
                ChangeRecords<ProyectoUbicacion> crsdhUbicaciones = sdhUbicaciones.ObjectData<ProyectoUbicacion>();

                foreach (var localizacion in crsdhUbicaciones.Deleted)
                {
                    int indice = proyecto.Ubicaciones.IndexOf(proyecto.Ubicaciones.FirstOrDefault(x => x.Id == localizacion.Id));
                    proyecto.Ubicaciones.RemoveAt(indice);
                }

                foreach (var localizacion in crsdhUbicaciones.Updated)
                {
                    int indice = proyecto.Ubicaciones.IndexOf(proyecto.Ubicaciones.FirstOrDefault(x => x.Id == localizacion.Id));
                    Csla.Data.DataMapper.Map(localizacion, proyecto.Ubicaciones[indice]);
                }

                foreach (var localizacion in crsdhUbicaciones.Created)
                {
                    proyecto.Ubicaciones.Add(localizacion);
                }

                //Proyecto Localizaciones 
                StoreDataHandler sdhLocalizaciones = new StoreDataHandler(jsonLocalizaciones);
                ChangeRecords<ProyectoLocalizacion> crsdhLocalizaciones = sdhLocalizaciones.ObjectData<ProyectoLocalizacion>();

                foreach (var localizacion in crsdhLocalizaciones.Deleted)
                {
                    int indice = proyecto.Localizaciones.IndexOf(proyecto.Localizaciones.FirstOrDefault(x => x.Id == localizacion.Id));
                    proyecto.Localizaciones.RemoveAt(indice);
                }

                foreach (var localizacion in crsdhLocalizaciones.Updated)
                {
                    int indice = proyecto.Localizaciones.IndexOf(proyecto.Localizaciones.FirstOrDefault(x => x.Id == localizacion.Id));
                    Csla.Data.DataMapper.Map(localizacion, proyecto.Localizaciones[indice]);
                }

                foreach (var localizacion in crsdhLocalizaciones.Created)
                {
                    proyecto.Localizaciones.Add(localizacion);
                }
            }
            #endregion

            #region Datos de Coordinación
            if (opc == 0 || tabNumero == 6)
            {
                //Proyecto Coordinadores
                StoreDataHandler sdhCoordinadores = new StoreDataHandler(jsonCoordinadores);
                ChangeRecords<ProyectoCoordinador> crsdhCoordinadores = sdhCoordinadores.ObjectData<ProyectoCoordinador>();

                foreach (ProyectoCoordinador coordinador in crsdhCoordinadores.Deleted)
                {
                    int indice = proyecto.Coordinadores.IndexOf(proyecto.Coordinadores.FirstOrDefault(x => x.Id == coordinador.Id));
                    proyecto.Coordinadores.RemoveAt(indice);
                }

                foreach (ProyectoCoordinador coordinador in crsdhCoordinadores.Updated)
                {
                    int indice = proyecto.Coordinadores.IndexOf(proyecto.Coordinadores.FirstOrDefault(x => x.Id == coordinador.Id));
                    Csla.Data.DataMapper.Map(coordinador, proyecto.Coordinadores[indice]);
                }

                foreach (ProyectoCoordinador coordinador in crsdhCoordinadores.Created)
                {
                    proyecto.Coordinadores.Add(coordinador);
                }
            }
            #endregion

            #region Datos de Componentes
            if (opc == 0 || tabNumero == 7)
            {
                //Informacion Financiera de los componentes del proyecto
                StoreDataHandler sdhInversionesComponente = new StoreDataHandler(jsonInversionesComponente);
                ChangeRecords<ProyectoComponenteInversion> crsdhInversionesComponente = sdhInversionesComponente.ObjectData<ProyectoComponenteInversion>();

                foreach (var componenteInversion in crsdhInversionesComponente.Deleted)
                {
                    int indice = proyecto.ComponenteInversiones.IndexOf(proyecto.ComponenteInversiones.FirstOrDefault(x => x.Id == componenteInversion.Id));
                    proyecto.ComponenteInversiones.RemoveAt(indice);
                }

                foreach (var componenteInversion in crsdhInversionesComponente.Updated)
                {
                    int indice = proyecto.ComponenteInversiones.IndexOf(proyecto.ComponenteInversiones.FirstOrDefault(x => x.Id == componenteInversion.Id));
                    Csla.Data.DataMapper.Map(componenteInversion, proyecto.ComponenteInversiones[indice]);
                }

                foreach (var componenteInversion in crsdhInversionesComponente.Created)
                {
                    proyecto.ComponenteInversiones.Add(componenteInversion);
                }

                //Informacion de los componentes del Proyecto
                StoreDataHandler sdhComponentes = new StoreDataHandler(jsonComponentes);
                ChangeRecords<ProyectoComponente> crsdhComponentes = sdhComponentes.ObjectData<ProyectoComponente>();

                foreach (var componenteInversion in crsdhComponentes.Deleted)
                {
                    int indice = proyecto.Componentes.IndexOf(proyecto.Componentes.FirstOrDefault(x => x.Id == componenteInversion.Id));
                    proyecto.Componentes.RemoveAt(indice);
                }

                foreach (var componenteInversion in crsdhComponentes.Updated)
                {
                    int indice = proyecto.Componentes.IndexOf(proyecto.Componentes.FirstOrDefault(x => x.Id == componenteInversion.Id));
                    Csla.Data.DataMapper.Map(componenteInversion, proyecto.Componentes[indice]);
                }

                foreach (var componenteInversion in crsdhComponentes.Created)
                {
                    proyecto.Componentes.Add(componenteInversion);
                }
            }
            #endregion

            #region Datos de Alcance y Objetivos
            if (opc == 0 || tabNumero == 8)
            {
                //Objetivos
                proyecto.ObjetivoGeneral = txtObjGeneral.Text;
                proyecto.ObjetivoEspecifico = txtObjEspecifico.Text;
            }
            #endregion

            #region Datos de Documentos
            if (opc == 0 || tabNumero == 9)
            {
                //Documentos del convenio
                StoreDataHandler sdhDocumentos = new StoreDataHandler(jsonDocumentos);
                ChangeRecords<DocumentoPerfil> crDocumentos = sdhDocumentos.ObjectData<DocumentoPerfil>();

                foreach (var documento in crDocumentos.Deleted)
                {
                    int indice = proyecto.DocumentosPerfil.IndexOf(proyecto.DocumentosPerfil.FirstOrDefault(x => x.Id == documento.Id));
                    proyecto.DocumentosPerfil.RemoveAt(indice);
                }

                foreach (var documento in crDocumentos.Created)
                {
                    proyecto.DocumentosPerfil.Add(documento);
                }
            }
            #endregion

            proyecto.Region = 1;
            proyecto.Provincia = 1;
            proyecto.Canton = 1;
            proyecto = proyecto.Save();
            hidIdPerfilProyecto.Text = proyecto.IDProyecto.ToString();

            int.TryParse(hidIdPerfilProyecto.Text, out IdProy);

            var proyectoR = Proyecto.GetProyecto(IdProy);
            switch (tabNumero)
            {
                case 1:
                    StoreSector.DataSource = proyectoR.Sectores;
                    StoreSector.DataBind();
                    break;
                case 2:
                    sProyectoEstados.DataSource = proyectoR.Estados;
                    sProyectoEstados.DataBind();
                    break;
                case 3:
                    sAvances.DataSource = proyectoR.Avances;
                    sAvances.DataBind();
                    break;
                case 4:
                    stoInversionistas.DataSource = proyectoR.Inversiones;
                    stoInversionistas.DataBind();
                    break;
                case 5:
                    stoLocalizacion.DataSource = proyectoR.Localizaciones;
                    stoLocalizacion.DataBind();
                    stoLocalizacionesGeo.DataSource = proyectoR.Ubicaciones;
                    stoLocalizacionesGeo.DataBind();
                    break;
                case 6:
                    sCoordinacion.DataSource = proyectoR.Coordinadores;
                    sCoordinacion.DataBind();
                    break;
                case 7:
                    stoComponente.DataSource = proyectoR.Componentes;
                    stoComponente.DataBind();
                    stoInversionistasComponente.DataSource = proyectoR.ComponenteInversiones;
                    stoInversionistasComponente.DataBind();
                    break;
                case 9:
                    StoreDocumentos.DataSource = proyectoR.DocumentosPerfil;
                    StoreDocumentos.DataBind();
                    break;
            }
            Ext.Msg.Show(new MessageBox.Config
            {
                Title = "Creacion de proyecto",
                Message = "El proyecto se guardo correctamente",
                Buttons = MessageBox.Button.OK,
                Icon = MessageBox.Icon.INFO
            });
            if (opc == 0)
            {
                LimpiarFormulario();
            }
        }
        catch (Exception ex)
        {
            Ext.Msg.Show(new MessageBox.Config
            {
                Title = "Error",
                Message = ex.ToString(),
                Buttons = MessageBox.Button.OK,
                Icon = MessageBox.Icon.ERROR
            });
            Util.RegistarLog(ex.ToString());
        }
    }
    #endregion

    #region Cargar datos de Localizacion
    private void CargarCantones(int Id)
    {
        CantonLookup.InvalidateCache();
        this.sCanton.DataSource = CantonLookup.GetNameValueList(Id);
        this.sCanton.DataBind();
    }
    private void CargarProvincias(int Id)
    {
        ProvinciaLookup.InvalidateCache();
        this.sProvincia.DataSource = ProvinciaLookup.GetNameValueList(Id);
        this.sProvincia.DataBind();
    }
    private void CargarRegion(int Id)
    {
        RegionLookup.InvalidateCache();
        this.sRegion.DataSource = RegionLookup.GetNameValueList(Id);
        this.sRegion.DataBind();
    }
    private void CargarDistrito(int Id)
    {
        DistritoLookup.InvalidateCache();
        this.sDistrito.DataSource = DistritoLookup.GetNameValueList(Id);
        this.sDistrito.DataBind();
    }
    protected void CantonRefresh(object sender, StoreRefreshDataEventArgs e)
    {
        try
        {
            CargarCantones(Convert.ToInt32(cbxProvincia.SelectedItem.Value));
        }
        catch { }
    }
    protected void ProvinciaRefresh(object sender, StoreRefreshDataEventArgs e)
    {
        try
        {
            CargarProvincias(Convert.ToInt32(cbxRegion.SelectedItem.Value));
        }
        catch { }
    }

    protected void RegionRefresh(object sender, StoreRefreshDataEventArgs e)
    {
        try
        {
            CargarRegion(Convert.ToInt32(cbxPais.SelectedItem.Value));
        }
        catch { }
    }
    protected void DistritoRefresh(object sender, StoreRefreshDataEventArgs e)
    {
        try
        {
            CargarDistrito(Convert.ToInt32(cbxCanton.SelectedItem.Value));
        }
        catch { }
    }
    #endregion

    #region Ventana Coordinacion

    public void Nuevo_Click(object sender, AjaxEventArgs e)
    {
        Limpiar();
        MostrarVentana();
    }

    public void MostrarVentana()
    {
        wCoordinacion.Show();
        wCoordinacion.Center();
    }

    public void OcultarVentana()
    {
        wCoordinacion.Hide();
    }

    public void btnIngresar_Click(object sender, AjaxEventArgs e)
    {
        //OcultarVentana();
    }

    public void btnCancelar_Click(object sender, AjaxEventArgs e)
    {
        Limpiar();
        OcultarVentana();
    }

    /**
     * Limpia los campos de la ventana de Coordinacion
     */
    public void Limpiar()
    {
        txtInstitucion.Text = "";
        txtResponsable.Text = "";
        txtMail.Text = "";
        txtTelefono.Text = "";
    }

    #endregion

    #region Limpiar Formulario

    /// <summary>
    /// Limpia el formulario
    /// </summary>
    void LimpiarFormulario()
    {
        dFechaHasta.SelectedDate = new DateTime(2500, 01, 01);
        txtNombreProyecto.Reset();
        txtDuracionProy.Reset();
        txaDescripcion.Reset();
        txtDuracionProy.Reset();
        txtObEstado.Reset();
        txtObjEspecifico.Reset();
        txtObjGeneral.Reset();
        nfInversionTotal.Reset();
        cbxRegion.Reset();
        txtObEstado.Reset();
        cbxProvincia.Reset();
        cbxPrograma.Reset();
        txtLatitud.Reset();
        txtLongitud.Reset();
        cbxEstadoProy.Reset();
        cbxEjes.Reset();
        cbxCanton.Reset();
        txtParroquia.Reset();
        sCoordinacion.RemoveAll();
        winProyectos.Hide();

    }
    #endregion

    #region Metodos para subir archivos

    /// <summary>
    /// Subir un archivo al proyecto
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    public void SubirArchivo_Click(object sender, AjaxEventArgs e)
    {
        string tpl = "Subido el archivo Correctamente: {0}<br/>Size: {1} bytes";
        string nombre = "";
        try
        {

            nombre = fufArchivosPP.PostedFile.FileName;
            nombre = UtilP.FormarNombre(nombre);
            fufArchivosPP.PostedFile.SaveAs(MapPath(string.Format("~/{0}{1}", ConfigurationManager.AppSettings.Get("PathFiles"), nombre)));
            fufArchivosPP.SetValue(nombre);

        }
        catch (Exception ex)
        {
            e.Success = false;
            Util.RegistarLog(ex.ToString());
        }

        if (this.fufArchivosPP.HasFile)
        {
            Ext.Msg.Show(new MessageBox.Config
            {
                Buttons = MessageBox.Button.OK,
                Icon = MessageBox.Icon.INFO,
                Title = "Éxito",
                Message = string.Format(tpl, this.fufArchivosPP.PostedFile.FileName, this.fufArchivosPP.PostedFile.ContentLength)
            });
            hiTipoDoc.SetValue(nombre.Substring(nombre.IndexOf(".") + 1));
            hiTamano.SetValue(this.fufArchivosPP.PostedFile.ContentLength);
            hiRuta.SetValue(nombre);
            hiTipo.SetValue("Documento Proyecto");
            e.Success = true;
        }
        else
        {
            e.Success = false;
            Ext.Msg.Show(new MessageBox.Config
            {
                Buttons = MessageBox.Button.OK,
                Icon = MessageBox.Icon.ERROR,
                Title = "Fallo",
                Message = "Archivo No subido!!!"
            });
        }
    }



    #endregion

    #region Visualizar Archivos
    protected void CommandVerArchivo_Click(object sender, AjaxEventArgs e)
    {
        try
        {
            string ruta = string.Format("{0}{1}", UtilP.RUTA_ARCHIVOS, e.ExtraParams["Nombre"]);
            //Page.Response.TransmitFile(ruta);
            winVerArchivo.LoadContent(ruta, true);
            winVerArchivo.SetTitle(e.ExtraParams["Nombre"]);
            winVerArchivo.Show();
        }
        catch (Exception ex)
        {
            Util.RegistarLog(ex.ToString());
        }

    }
    #endregion

    #region Componentes
    protected void NuevoComponente_click(object sender, AjaxEventArgs e)
    {
        if (e.ExtraParams["Operacion"] == "Nuevo")
        {
            hidIdComponente.Text = Guid.NewGuid().ToString();
        }
    }
    protected void Command_Click(object sender, AjaxEventArgs e)
    {
        hidOprComponente.Text = e.ExtraParams["Comando"];
        if (e.ExtraParams["Comando"] == "Editar")
        {
            hidIdComponente.Text = e.ExtraParams["id"];
        }

    }

    #endregion
}
